home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 21 / CU Amiga Magazine's Super CD-ROM 21 (1998)(EMAP Images)(GB)[!][issue 1998-04].iso / CUCD / Programming / RTGMaster / demos / moon / FIXED.H < prev    next >
C/C++ Source or Header  |  1996-03-05  |  7KB  |  176 lines

  1. //----------------------------------------------------------------------------
  2. // TYPE  fixed
  3. //----------------------------------------------------------------------------
  4.  
  5. typedef unsigned int     fixed;
  6.  
  7. //----------------------------------------------------------------------------
  8. // TYPE  angle_t
  9. //----------------------------------------------------------------------------
  10.  
  11. typedef int     angle_t;
  12.  
  13. //----------------------------------------------------------------------------
  14. // Conversion macros:
  15. //----------------------------------------------------------------------------
  16.  
  17. #define int_to_fixed_(x)       ( ( (int) (x) ) << 16 )
  18. #define double_to_fixed_(x)    ( (int) ((x) * 65536.0 + 0.5 ) )
  19.  
  20. #define fixed_to_int_(x)       ( (int) ( (x) >> 16 ) )
  21. #define round_fixed_to_int_(x) ( ((x) + 0x8000) >> 16 )
  22. #define fixed_to_double_(x)    ( (double) (x) / 65536.0 )
  23. #define fixed_abs_(x)          ( ((x) >= 0) ? (x) : (-(x)) )
  24.  
  25. //----------------------------------------------------------------------------
  26. // Common numerical constants:
  27. //----------------------------------------------------------------------------
  28.  
  29. #define FIX_1      int_to_fixed_(1)
  30. #define FIX_PI     205887L
  31. #define FIX_2PI    411775L  // 2PI != 2 * PI
  32. #define FIX_E      178144L
  33. #define FIX_ROOT2   74804L
  34. #define FIX_ROOT3  113512L
  35. #define FIX_GOLDEN 106039L
  36.  
  37. //----------------------------------------------------------------------------
  38. // Functions:
  39. //----------------------------------------------------------------------------
  40.  
  41. fixed          FIX_mul       ( fixed, fixed );
  42. fixed          FIX_div       ( fixed numerator, fixed denominator );
  43. fixed          FIX_square    ( fixed ); // Faster than using FIX_mul
  44. fixed          FIX_invert    ( fixed ); // 1 over n; faster than FIX_div
  45. fixed          FIX_sqrt_lp   ( fixed ); // Low  Precision (8:8)
  46. fixed          FIX_sqrt_hp   ( fixed ); // High Precision (8:16)
  47.  
  48. void           FIX_cos_sin   ( angle_t, fixed * cosine, fixed * sine );
  49.  
  50. //----------------------------------------------------------------------------
  51. // FUNCTION  FIX_mul
  52. //----------------------------------------------------------------------------
  53. #ifdef ALT030196
  54. #pragma aux FIX_mul =       \
  55.     "imul edx"              \
  56.     "add eax, 8000h"        \
  57.     "adc edx, 0"            \
  58.     "shrd eax, edx, 16"     \
  59.     parm caller [eax] [edx] \
  60.     value [eax]             \
  61.     modify [eax edx];
  62.  
  63. //----------------------------------------------------------------------------
  64. // FUNCTION  FIX_div
  65. //----------------------------------------------------------------------------
  66.  
  67. #pragma aux FIX_div =       \
  68.     "xor eax, eax"          \
  69.     "shrd eax, edx, 16"     \
  70.     "sar edx, 16"           \
  71.     "idiv ebx"              \
  72.     parm caller [edx] [ebx] \
  73.     value [eax]             \
  74.     modify [eax ebx edx];
  75.  
  76. //----------------------------------------------------------------------------
  77. // FUNCTION  FIX_square
  78. //----------------------------------------------------------------------------
  79. // This is faster than using FIX_mul for squares.
  80. //----------------------------------------------------------------------------
  81.  
  82. #pragma aux FIX_square =    \
  83.     "imul eax"              \
  84.     "add eax, 8000h"        \
  85.     "adc edx, 0"            \
  86.     "shrd eax, edx, 16"     \
  87.     parm caller [eax]       \
  88.     value [eax]             \
  89.     modify [eax edx];
  90.  
  91. //----------------------------------------------------------------------------
  92. // FUNCTION  FIX_invert
  93. //----------------------------------------------------------------------------
  94. // This is faster than using FIX_div.
  95. //----------------------------------------------------------------------------
  96.  
  97. #pragma aux FIX_invert =    \
  98.     "xor eax, eax"          \
  99.     "mov edx, 1"            \
  100.     "idiv ebx"              \
  101.     parm caller [ebx]       \
  102.     value [eax]             \
  103.     modify [eax ebx edx];
  104.  
  105. //----------------------------------------------------------------------------
  106. // FUNCTION  FIX_sqrt_lp
  107. //----------------------------------------------------------------------------
  108.  
  109. #pragma aux FIX_sqrt_lp =            \
  110.     "         xor eax, eax"          \
  111.     "         mov ebx, 40000000h"    \
  112.     "sqrtLP1: mov edx, ecx"          \
  113.     "         sub edx, ebx"          \
  114.     "         jl  sqrtLP2"           \
  115.     "         sub edx, eax"          \
  116.     "         jl  sqrtLP2"           \
  117.     "         mov ecx,edx"           \
  118.     "         shr eax, 1"            \
  119.     "         or  eax, ebx"          \
  120.     "         shr ebx, 2"            \
  121.     "         jnz sqrtLP1"           \
  122.     "         shl eax, 8"            \
  123.     "         jmp sqrtLP3"           \
  124.     "sqrtLP2: shr eax, 1"            \
  125.     "         shr ebx, 2"            \
  126.     "         jnz sqrtLP1"           \
  127.     "         shl eax, 8"            \
  128.     "sqrtLP3: nop"                   \
  129.     parm caller [ecx]                \
  130.     value [eax]                      \
  131.     modify [eax ebx ecx edx];
  132.  
  133. //----------------------------------------------------------------------------
  134. // FUNCTION  FIX_sqrt_hp
  135. //----------------------------------------------------------------------------
  136.  
  137. #pragma aux FIX_sqrt_hp =            \
  138.     "         xor eax, eax"          \
  139.     "         mov ebx, 40000000h"    \
  140.     "sqrtHP1: mov edx, ecx"          \
  141.     "         sub edx, ebx"          \
  142.     "         jb  sqrtHP2"           \
  143.     "         sub edx, eax"          \
  144.     "         jb  sqrtHP2"           \
  145.     "         mov ecx,edx"           \
  146.     "         shr eax, 1"            \
  147.     "         or  eax, ebx"          \
  148.     "         shr ebx, 2"            \
  149.     "         jnz sqrtHP1"           \
  150.     "         jz  sqrtHP5"           \
  151.     "sqrtHP2: shr eax, 1"            \
  152.     "         shr ebx, 2"            \
  153.     "         jnz sqrtHP1"           \
  154.     "sqrtHP5: mov ebx, 00004000h"    \
  155.     "         shl eax, 16"           \
  156.     "         shl ecx, 16"           \
  157.     "sqrtHP3: mov edx, ecx"          \
  158.     "         sub edx, ebx"          \
  159.     "         jb  sqrtHP4"           \
  160.     "         sub edx, eax"          \
  161.     "         jb  sqrtHP4"           \
  162.     "         mov ecx, edx"          \
  163.     "         shr eax, 1"            \
  164.     "         or  eax, ebx"          \
  165.     "         shr ebx, 2"            \
  166.     "         jnz sqrtHP3"           \
  167.     "         jmp sqrtHP6"           \
  168.     "sqrtHP4: shr eax, 1"            \
  169.     "         shr ebx, 2"            \
  170.     "         jnz sqrtHP3"           \
  171.     "sqrtHP6: nop"                   \
  172.     parm caller [ecx]                \
  173.     value [eax]                      \
  174.     modify [eax ebx ecx edx];
  175. #endif
  176.